/*
 * XSAN网络地址模块
 * 提供统一的网络地址表示和处理
 */

#ifndef XSAN_ADDRESS_H
#define XSAN_ADDRESS_H

#include <stdint.h>
#include <stdbool.h>
#include <netinet/in.h>

#ifdef __cplusplus
extern "C" {
#endif

/**
 * @brief XSAN网络地址结构体，用于统一IPv4和IPv6地址表示
 */
struct xsan_address {
    union {
        struct sockaddr_in  ipv4;
        struct sockaddr_in6 ipv6;
    } addr;
    bool is_ipv6;  /**< 是否为IPv6地址 */
    
    /* 添加便捷访问字段 */
    char ip[INET6_ADDRSTRLEN]; /**< IP地址字符串表示 */
    uint16_t port;            /**< 端口号 */
};

typedef struct xsan_address xsan_address_t;

/**
 * @brief 将字符串形式的IP地址和端口转换为xsan_address_t结构
 * 
 * @param ip_str IP地址字符串（IPv4或IPv6）
 * @param port 端口号
 * @param addr 输出参数，存储转换后的地址
 * @return int 成功返回0，失败返回-1
 */
int xsan_address_from_string(const char *ip_str, uint16_t port, xsan_address_t *addr);

/**
 * @brief 将xsan_address_t结构转换为字符串形式
 * 
 * @param addr 源地址
 * @param ip_str 输出参数，存储IP地址字符串
 * @param ip_str_len ip_str缓冲区的长度
 * @param port 输出参数，存储端口号
 * @return int 成功返回0，失败返回-1
 */
int xsan_address_to_string(const xsan_address_t *addr, char *ip_str, size_t ip_str_len, uint16_t *port);

/**
 * @brief 比较两个地址是否相同
 * 
 * @param addr1 第一个地址
 * @param addr2 第二个地址
 * @return bool 相同返回true，不同返回false
 */
bool xsan_address_equals(const xsan_address_t *addr1, const xsan_address_t *addr2);

#ifdef __cplusplus
}
#endif

#endif /* XSAN_ADDRESS_H */ 